// Copyright (C) 2011  Andrew H. Chan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

#ifndef _GRAPHDATA_H__
#define _GRAPHDATA_H__

#include "typedefs.h"

template <typename VertexT>
class Segment_graph_data {
    public:
        std::vector<VertexT> terminal_vertices;
        boost::unordered_set<VertexT> terminal_set;
};

template <typename VertexT>
class Level1_data {
    public:
        std::vector<VertexT> terminal_vertices;
        boost::unordered_set<VertexT> terminal_set;
        boost::unordered_map<int, double> edge_costs;
};

template <typename VertexT>
class Level2_data {
    public:
        std::vector<VertexT> terminal_vertices;
        boost::unordered_set<VertexT> terminal_set;
        boost::unordered_map<int, double> edge_costs;
};

class Segment_edge_data {
    public:
        Segment_edge_data(int weight = 1) : weight(weight) {}
        int weight;
};

class Level1_edge_data {
    public:
        Level1_edge_data(int weight = 1) : weight(weight) {}
        int weight;
};

class Level2_edge_data {
    public:
        Level2_edge_data(int type = 0, int weight = 1, std::pair<char,char> detail = (std::pair<char,char>())) : type(type), weight(weight), detail(detail) {}
        int type;
        int weight;
        std::pair<char,char> detail;
};

class Edge_null_data {};

#endif
